package demo02_oop

//apply方法相当于把类的实例化对象当成函数使用
//如果在一个文件中有同名的class和object class和object是互为伴生的关系
//样例类 默认提供 伴生对象中的apply unapply方法  类 hashcode equals copy toString
//      在默认提供的方法基础上可以定义自己的属性和方法
case class Student1(name:String,isHero:Boolean){

}

/**
 * Object 对象
 *  此对象的实例化对象是唯一的，相当于java中的单例模式
 *  此对象中的属性和方法 直接用类名点出来，相当于java中的静态类
 *  所以此对象不能使用new创建实例化对象
 */
//object Student{
//  def apply(): Car = new Student()
//}

object Demo04_apply {

  def main(args: Array[String]): Unit = {

    //使用了样例类提供的 apply 方法
    val stu1: Student1 = Student1("tom",true)
    //使用了样例类提供的 toString 方法（直接输出实例化对象即调用toString方法）
    //运行结果：stu1:Student(tom,true)
    println(s"stu1:${stu1}")

    //使用了样例类提供的 copy 方法，完全复制
    val stu2:Student1 = stu1.copy()
    //运行结果：stu2:Student(tom,true)
    println(s"stu2:${stu2}")

    //使用了样例类提供的 equals 方法
    //运行结果：true
    println(stu1 == stu2)

    //使用了样例类提供的 copy 方法，修改部分数据
    val stu3:Student1 = stu1.copy(name="jerry")
    //运行结果：stu3:Student(jerry,true)
    println(s"stu3:${stu3}")
    val stu4:Student1 = stu1.copy(isHero=false)
    //运行结果：stu4:Student(tom,false)
    println(s"stu4:${stu4}")

    //使用了样例类提供的 copy 方法，修改所有数据
    val stu5:Student1 = stu1.copy(name="jerry",isHero=false)
    //运行结果：stu5:Student(Jerry,false)
    println(s"stu5:${stu5}")

  }

}
